#include <iostream>
#include <stdlib.h>
#include <fstream>
#include "Rectangulo.h"
using namespace std;

/** \file Rectangulo.cc
* \brief Procedimientos de la clase Rectangulo.
*
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/


Rectangulo::Rectangulo( Coordenada origen, float pbase, float paltura, int grosor, Color fondo, Color linea):Figura2D(origen,grosor,fondo,linea)
{
	if( pbase < 0 )
	{
		throw ExcepcionValorNoValido(pbase, "ExcepcionValorNoValido: la base debe ser positiva");
	}
	else
	{
		base = pbase;
	}

	if( paltura < 0 )
	{
		throw ExcepcionValorNoValido(paltura, "ExcepcionValorNoValido: la altura debe ser positiva");
	}
	else
	{
		altura = paltura;
	}
}

Rectangulo::Rectangulo( const Rectangulo &r)
{
	Figura2D::operator=(r);
	base = r.base;
	altura = r.altura;

}

Rectangulo::~Rectangulo()
{
	base = altura = 0;
}

Rectangulo&
Rectangulo::operator =( const Rectangulo &r)
{
	if ( this != &r )
	{
		Figura2D::operator=(r);
		base = r.base;
		altura = r.altura;
	}

	return *this;
}

float
Rectangulo::getBase() const
{
	return base;
}

float
Rectangulo::getAltura() const
{
	return altura;
}

void
Rectangulo::setBase(float b)
{
	if ( b > 0)
	{
		base = b;
	}
	else
	{
		throw ExcepcionValorNoValido(b, "ExcepcionValorNoValido: la base debe ser positiva");
	}
}

void
Rectangulo::setAltura(float a)
{
	if ( a > 0)
	{
		altura = a;
	}
	else
	{
		throw ExcepcionValorNoValido(a, "ExcepcionValorNoValido: la altura debe ser positiva");
	}
}

void
Rectangulo::pintar(ostream &os) const
{
	os << "<rect x=\"" << Figura2D::getOrigen().getX() << "\" y=\"" << Figura2D::getOrigen().getY() << "\" width=\"" << base << "\" height=\"" << altura << "\"" << endl;
	Figura2D::pintar(os);
	os<<" />";
	os<<endl;
}

void
Rectangulo::leeEntrada(istream& is){

	Figura2D::leeEntrada(is);
	float base,altura;
	
	is >> base;
	is >> altura;
	setBase(base);
	setAltura(altura);
}

Rectangulo*
Rectangulo::clonar() const
{
	/*Rectangulo* rect = new Rectangulo(base,altura);
	rect->setGrosorLinea(getGrosorLinea());
	rect->setFondo(getFondo());
	rect->setLinea(getLinea());*/
	Rectangulo* rectu = new Rectangulo(*this);
	return rectu;
	
}

void 
Rectangulo::escalar(float porcentaje)
{
	try
	{
		if(porcentaje > 0)
		{
			base=base*(porcentaje/100);
			altura=altura*(porcentaje/100);
		}
		else
		{
			throw ExcepcionValorNoValido(porcentaje, "ExcepcionValorNoValido: el porcentaje debe ser positivo");
		}
	}

	catch( ExcepcionValorNoValido &e)
	{
		cerr << e.what();
	}
}

ostream&
operator<<(ostream &os, const Rectangulo &r)
{
	r.pintar(os);

	return os;
}
